package com.yuxi.distributelock;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.exception.MemcachedException;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.concurrent.TimeoutException;

/**
 * Created by yuxi on 16/12/26.
 * 利用memcache 实现分布式锁 memcache.add() 操作的特点是第一次add成功之后,其他的add()操作是不可以成功的
 * memcache.set() 多个线程的操作是以最后一个操作为准
 */
public class MemcacheLock {
    @Autowired
    private MemcachedClient memcachedClient;
    /**
     *  方法Lock的功能描述:memcache 加锁,操作完就释放锁
     *  优点是: 操作简单,高效
     *  缺点是: memcache 缓存有过期时间,memcache如果缓存异常就会丢失数据
     *  方法改动记录:
     *
     *  @params : [key]
     *  @return  boolean
     *  @throw
     *
     *  @version :  V1.0.0
     *  @since   :  16/12/26 15:52
     *
     *  AUTHOR   :  yuxi
     **/
    public boolean Lock(String key) {
        try {
            if (memcachedClient.add(key, 30, 1)) {//加锁成功
                return true;
            } else {//加锁失败
                return false;
            }
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (MemcachedException e) {
            e.printStackTrace();
        } finally {
            try {
                memcachedClient.delete(key);
            } catch (TimeoutException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (MemcachedException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
}
